package route

import (
	"net/http"
	"os"
	"os/exec"
	"strings"

	"gitee.com/liumou_site/logger"
	"github.com/PuerkitoBio/goquery"
	"github.com/gin-gonic/gin"
)

// Check 函数用于检查系统是否支持 ping 和 traceroute 命令，并尝试执行这些命令以验证其可用性和权限。
// 该函数没有参数和返回值。
func Check() {
	// 检查系统是否支持 ping 命令
	_, err := exec.LookPath("ping")
	if err != nil {
		logger.Error("ping命令执行失败:", err)
		os.Exit(1)
	}

	// 检查系统是否支持 traceroute 命令
	_, err = exec.LookPath("traceroute")
	if err != nil {
		logger.Error("traceroute命令执行失败:", err)
		os.Exit(1)
	}
	// 检查tcptraceroute
	_, err = exec.LookPath("tcptraceroute")
	if err != nil {
		logger.Error("tcptraceroute命令执行失败:", err)
		os.Exit(1)
	}

	cmd := exec.Command("ping", "-c", "1", "127.0.0.1")
	if err := cmd.Run(); err != nil {
		logger.Error("ping命令执行失败:", err)
		os.Exit(1)
	}
	// 如果 traceroute 命令可用，则尝试执行 traceroute 命令来验证其功能和权限
	cmd = exec.Command("traceroute", "127.0.0.1")
	if err := cmd.Run(); err != nil {
		logger.Error("traceroute命令执行失败:", err)
		os.Exit(1)
	}
	// 如果 tcptraceroute 命令可用，则尝试执行 tcptraceroute 命令来验证其功能和权限
	cmd = exec.Command("tcptraceroute", "127.0.0.1", "22")
	if err := cmd.Run(); err != nil {
		logger.Error("tcptraceroute命令执行失败:", err)
		os.Exit(1)
	}
}

// Parse 是一个处理HTML解析请求的函数
// 它作为gin框架的路由处理器，响应 POST 请求到 /parse 路径
func Parse(r *gin.Engine) {
	r.POST("/parse", func(c *gin.Context) {
		// 尝试绑定请求体到htmlContent变量，如果失败则返回错误信息
		var htmlContent string
		if err := c.ShouldBind(&htmlContent); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		// 解析HTML并提取有用信息
		doc, err := goquery.NewDocumentFromReader(strings.NewReader(htmlContent))
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
			return
		}

		// 提取所有链接
		var links []string
		doc.Find("a").Each(func(i int, s *goquery.Selection) {
			href, exists := s.Attr("href")
			if exists {
				links = append(links, href)
			}
		})

		// 返回解析结果
		c.JSON(http.StatusOK, gin.H{
			"message": "HTML解析成功",
			"links":   links,
		})
	})
}
